{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e31f7820",
   "metadata": {
    "id": "1-模块基本介绍与使用"
   },
   "source": [
    "#  Task 02 Python Excel 自动化之 XLWings"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a07a590",
   "metadata": {},
   "source": [
    "## 2.0 模块基本介绍与使用\n",
    "\n",
    "**xlwings** <br/>\n",
    "基本介绍：用于Python与Excel之间的交互，可以轻松地从 Excel 调用 Python，也可以利用Python自动化操作Excel，调用VBA，非常方便。\n",
    "\n",
    "项目地址：https://github.com/xlwings/xlwings\n",
    "\n",
    "![xlwings-principle](./imgs/Python_Excel_XLWings/xlwings-principle.png)\n",
    "基本使用方法：新建一个excel文件，取名为xlwings_wb.xlsx，并新建一个sheet，取名为first_sht，在其A1单元格内插入字符串`Datawhale`。\n",
    "\n",
    "打开 CMD/Terminal 进入到自己环境后，执行下面语句安装 xlwings 模块。\n",
    "```python\n",
    "pip3 install xlwings\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ecb753a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "root_path = './XLWings_test/'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "79f2801e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入xlwings，并起一个别名 xw，方便操作\n",
    "import xlwings as xw\n",
    "\n",
    "# 1、创建一个app应用，打开Excel程序\n",
    "# visible=True 表示打开操作Excel过程可见 初次接触可以设置为True，了解其过程\n",
    "# add_book=False 表示启动app后不用新建个工作簿\n",
    "app = xw.App(visible=True, add_book=False)\n",
    "\n",
    "# 2、新建一个工作簿\n",
    "wb = app.books.add()\n",
    "\n",
    "# 3、新建一个sheet，并操作\n",
    "# 3.1 新建sheet 起名为first_sht\n",
    "sht = wb.sheets.add('first_sht')\n",
    "# 3.2 在新建的sheet表中A1位置插入一个值：Datawhale\n",
    "sht.range('A1').value = 'Datawhale'\n",
    "# 3.3 保存新建的工作簿，并起一个名字\n",
    "wb.save(root_path+'xlwings_wb.xlsx')\n",
    "\n",
    "# 4、关闭工作簿\n",
    "wb.close()\n",
    "\n",
    "# 5、程序运行结束，退出Excel程序\n",
    "app.quit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "925fc858",
   "metadata": {},
   "source": [
    "通过简单五步，我们就可以完成新建一个excel，并向其中指定sheet中的指定位置输入值了。\n",
    "![code-result](./imgs/Python_Excel_XLWings/code-result.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c221bf24",
   "metadata": {
    "id": "2-xlwings模块实战"
   },
   "source": [
    "## 2.1 xlwings模块实战"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "619d0ada",
   "metadata": {
    "id": "2-1-基础语法一览"
   },
   "source": [
    "### 2.1.1 基础语法一览\n",
    "\n",
    "- 导包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "48b12c46",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 基础导入包\n",
    "import xlwings as xw  # 程序第一步"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0267dbb",
   "metadata": {},
   "source": [
    "- 打开关闭Excel程序（理解成excel软件打开、关闭）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fe2293d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# visible=True 表示打开操作Excel过程可见 初次接触可以设置为True，了解其过程\n",
    "# add_book=False 表示启动app后不用新建个工作簿\n",
    "app = xw.App(visible=True, add_book=False)  # 程序第二步\n",
    "\n",
    "# 关闭excel程序\n",
    "# app.quit()  # 程序最后一步"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2aeba6d2",
   "metadata": {},
   "source": [
    "- 工作簿相关操作（理解成excel文件）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "dd2431b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1、新建一个工作簿\n",
    "# wb = app.books.add()  # 程序第三步\n",
    "\n",
    "# 2、保存新建的工作簿，并起一个名字\n",
    "# 程序倒数第三步，非常关键，保存操作数据结果\n",
    "# wb.save(root_path+'xlwings_wb.xlsx')  \n",
    "\n",
    "\n",
    "# 3、打开一个已经存在的工作簿\n",
    "wb = app.books.open(root_path+'xlwings_wb.xlsx')  # 程序第三步\n",
    "\n",
    "# 4、关闭工作簿\n",
    "# wb.close()  # 程序倒数第二步"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f8bc855",
   "metadata": {},
   "source": [
    "- sheet相关操作（理解成工作表）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e04cf64f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sht1: <Sheet [xlwings_wb.xlsx]second_sht>\n",
      "sht2: <Sheet [xlwings_wb.xlsx]first_sht>\n",
      "sht3: <Sheet [xlwings_wb.xlsx]second_sht>\n",
      "工作簿中的sheet个数为：3\n",
      "sht1.name: second_sht\n",
      "sht1.used_range.last_cell.row: 1\n",
      "sht1.used_range.last_cell.column: 1\n"
     ]
    }
   ],
   "source": [
    "# 在工作簿中新建一个sheet，起名为 second_sht\n",
    "sht1 = wb.sheets.add('second_sht')\n",
    "print('sht1:', sht1)\n",
    "\n",
    "# 选中已经存在的sheet\n",
    "sht2 = wb.sheets('first_sht')\n",
    "print('sht2:', sht2)\n",
    "\n",
    "# 也可以通过索引选择已存在的sheet\n",
    "sht3 = wb.sheets[0]  # 选中工作簿中的第一个sheet\n",
    "print('sht3:', sht3)\n",
    "\n",
    "# 获取工作簿中工作表的个数\n",
    "sht_nums = wb.sheets.count\n",
    "print('工作簿中的sheet个数为：%d'% sht_nums)\n",
    "\n",
    "# 当前工作表名字\n",
    "print('sht1.name:', sht1.name)\n",
    "\n",
    "# 获取指定sheet中数据的行数\n",
    "print('sht1.used_range.last_cell.row:', sht1.used_range.last_cell.row)\n",
    "\n",
    "# 获取指定sheet中数据的列数\n",
    "print('sht1.used_range.last_cell.column:', sht1.used_range.last_cell.column)\n",
    "\n",
    "# 删除指定的sheet 比如删除：first_sht\n",
    "wb.sheets('first_sht').delete()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "984d5800",
   "metadata": {},
   "source": [
    "- 单元格相关操作（就是excel单元格子）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a9f69a40",
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "写入\n",
    "'''\n",
    "# 在工作表中指定位置插入数据\n",
    "sht1.range('B1').value = 'Datawhale'\n",
    "\n",
    "# 在工作表指定位置插入多个数据 默认是横向插入\n",
    "sht1.range('B2').value = ['DATAWHALE', 'FOR', 'THE', 'LEARNER']\n",
    "\n",
    "# 在工作表指定位置竖向插入多个数据\n",
    "# 设置 options(transpose=True)，transpose=True 表示转置的意思\n",
    "sht1.range('B3').options(transpose=True).value = [1, 2, 3, 4]\n",
    "\n",
    "# 在工作表指定位置开始插入多行数据\n",
    "sht1.range('B7').value = [['a', 'b'], ['c', 'd']]\n",
    "\n",
    "# 在工作表指定位置开始插入多列数据\n",
    "sht1.range('B9').options(transpose=True).value = [['a', 'b'], ['c', 'd']]\n",
    "\n",
    "# 向单元格写入公式\n",
    "sht1.range('F2').formula = '=sum(B2:E2)'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ccc567d",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-write](./imgs/Python_Excel_XLWings/xlwings-write.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b7d2aa29",
   "metadata": {
    "id": "2-1-基础语法一览-code"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "单元格B1= Datawhale\n",
      "单元格B2:F2= ['DATAWHALE', 'FOR', 'THE', 'LEARNER', 0.0]\n",
      "单元格B3:B6= [1.0, 2.0, 3.0, 4.0]\n",
      "单元格B7:C10= [['a', 'c', 'a', 'b'], ['b', 'd', 'c', 'd']]\n"
     ]
    }
   ],
   "source": [
    "'''\n",
    "读取\n",
    "'''\n",
    "# 在工作表中读取指定位置数据\n",
    "print('单元格B1=', sht1.range('B1').value)\n",
    "\n",
    "# 在工作表中读取指定区域数据 一行\n",
    "print('单元格B2:F2=', sht1.range('B2:F2').value)\n",
    "\n",
    "# 在工作表中读取指定区域数据 一列\n",
    "print('单元格B3:B6=', sht1.range('B3:B6').value)\n",
    "\n",
    "# 在工作表中读取指定区域数据 一个区域\n",
    "# 设置options(transpose=True)就可以按列读 不设置就是按行读\n",
    "print('单元格B7:C10=', sht1.range('B7:C10').options(transpose=True).value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "80191314",
   "metadata": {
    "id": "2-1-基础语法一览-code-2"
   },
   "outputs": [],
   "source": [
    "'''\n",
    "删除\n",
    "'''\n",
    "# 删除指定单元格中的数据\n",
    "sht1.range('B10').clear()\n",
    "\n",
    "# 删除指定范围内单元格数据\n",
    "sht1.range('B7:B9').clear()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8fed0f79",
   "metadata": {},
   "source": [
    "### 2.1.2 单元格样式设置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "109f2842",
   "metadata": {
    "id": "2-1-基础语法一览-code-3"
   },
   "outputs": [],
   "source": [
    "'''\n",
    "格式修改\n",
    "'''\n",
    "# 选中已经存在的sheet\n",
    "sht1 = wb.sheets('second_sht')\n",
    "# 返回单元格绝对路径\n",
    "sht1.range('B3').get_address()\n",
    "# sht1.range('B3').address\n",
    "\n",
    "# 合并单元格B3 C3\n",
    "sht1.range('B3:C3').api.merge()\n",
    "\n",
    "# 解除合并单元格B3 C3\n",
    "# sht1.range('B3:C3').api.unmerge()\n",
    "\n",
    "# 向指定单元格添加带超链接文本\n",
    "# address- 超连接地址\n",
    "# text_to_display- 超链接文本内容\n",
    "# screen_tip- 鼠标放到超链接上后显示提示内容\n",
    "sht1.range('C2').add_hyperlink(address='https://datawhale.club',\n",
    "                   text_to_display='DATAWHALE 官网',\n",
    "                   screen_tip='点击查看 DATAWHALE 官网 ')\n",
    "\n",
    "# 获取指定单元格的超链接地址\n",
    "sht1.range('C2').hyperlink\n",
    "\n",
    "# 自动调试指定单元格高度和宽度\n",
    "sht1.range('B1').autofit()\n",
    "\n",
    "# 设置指定单元格背景颜色\n",
    "sht1.range('B1').color = (93,199,221)\n",
    "\n",
    "# 返回指定范围内的中第一列的编号 数字，如：A-1 B-2\n",
    "sht1.range('A2:B2').column\n",
    "\n",
    "# 获取或者设置行高/列宽\n",
    "# row_height/column_width会返回行高/列宽 ，范围内行高/列宽不一致会返回None\n",
    "# 也可以设置一个新的行高/列宽\n",
    "sht1.range('A2').row_height = 25\n",
    "sht1.range('B2').column_width = 20"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe6d887c",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-format](./imgs/Python_Excel_XLWings/xlwings-format.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2d758d4",
   "metadata": {
    "id": "2-1-基础语法一览-4"
   },
   "source": [
    "- 在windows上可以使用以下方法设置单元格文字颜色等格式，如下：\n",
    "\n",
    "```python\n",
    "# windows系统下字体设置在 sheet.range().api.Font下\n",
    "# 颜色\n",
    "sht1.range('A1').api.Font.Color = (255,0,124)\n",
    "# 字体名字\n",
    "sht1.range('A1').api.Font.Name = '宋体'\n",
    "# 字体大小\n",
    "sht1.range('A1').api.Font.Size = 28\n",
    "# 是否加粗\n",
    "sht1.range('A1').api.Font.Bold = True\n",
    "# 数字格式\n",
    "sht1.range('A1').api.NumberFormat = '0.0'\n",
    "# -4108 水平居中\n",
    "# -4131 靠左\n",
    "# -4152 靠右\n",
    "sht1.range('A1').api.HorizontalAlignment = -4108\n",
    "# -4108 垂直居中（默认)\n",
    "# -4160 靠上\n",
    "# -4107 靠下\n",
    "# -4130 自动换行对齐。\n",
    "sht1.range('A1').api.VerticalAlignment = -4130\n",
    "# 设置上边框线风格和粗细\n",
    "sht1.range('A1').api.Borders(8).LineStyle = 5\n",
    "sht1.range('A1').api.Borders(8).Weight = 3\n",
    "```\n",
    "\n",
    "- 在mac下可以通过以下方法设置字体格式\n",
    "\n",
    "```python\n",
    "# 在mac下可以通过以下方法设置字体格式\n",
    "# 设置单元格的字体颜色\n",
    "rgb_tuple = (0, 10, 200)\n",
    "sht1.range('B1').api.font_object.color.set(rgb_tuple)\n",
    "\n",
    "# 获取指定单元格字体颜色\n",
    "sht1.range('B1').api.font_object.color.get()\n",
    "\n",
    "# 获取指定单元格字体名字 可以使用set方法修改字体 set('宋体')\n",
    "sht1.range('B1').api.font_object.name.get()\n",
    "\n",
    "# 设置指定单元格字体格式 可以用get方法查看单元格字体格式\n",
    "sht1.range('B3').api.font_object.font_style.set('加粗')\n",
    "\n",
    "# 设置指定单元格字体大小\n",
    "sht1.range('B3').api.font_object.font_size.set(20)\n",
    "\n",
    "# 设置边框线粗细\n",
    "sht1.range('B2').api.get_border(which_border=9).weight.set(4)\n",
    "\n",
    "# 设置边框线风格\n",
    "sht1.range('B2').api.get_border(which_border=9).line_style.set(8)\n",
    "```\n",
    "\n",
    "样式值含义基本说明：\n",
    "\n",
    "![xlwings-border](./imgs/Python_Excel_XLWings/xlwings-border.png)\n",
    "\n",
    "![xlwings-line](./imgs/Python_Excel_XLWings/xlwings-line.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdc9d97c",
   "metadata": {},
   "source": [
    "再次提醒，进行完所有操作后一定要记得执行以下三句："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "90a5cf1e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存新建的工作簿，并起一个名字（如果已存在有名字的excel文件，就直接save即可）\n",
    "wb.save()\n",
    "# 关闭工作簿（关闭Excel文件）\n",
    "wb.close()\n",
    "# 程序运行结束，退出Excel程序\n",
    "app.quit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a830083",
   "metadata": {},
   "source": [
    "### 2.1.3 Excel中生成统计图或者插入图片"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4d4cfd9",
   "metadata": {},
   "source": [
    "- 自动生成统计图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9b9bad15",
   "metadata": {},
   "outputs": [],
   "source": [
    "import xlwings as xw\n",
    "\n",
    "# 新建一个sheet\n",
    "app = xw.App(visible=True, add_book=False)\n",
    "wb = app.books.open(root_path+'xlwings_wb.xlsx')\n",
    "sht3 = wb.sheets.add('third_sht')\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# 生成模拟数据\n",
    "df = pd.DataFrame({\n",
    "    'money':np.random.randint(45, 50, size = [1, 20])[0],\n",
    "},\n",
    "    index=pd.date_range('2021-02-01', '2021-02-20'),  # 行索引和时间相关\n",
    ")\n",
    "df.index.name = '消费日期'  # 设置索引名字\n",
    "\n",
    "sht3.range('A1').value = df\n",
    "\n",
    "# 生成图表\n",
    "chart1 = sht3.charts.add()  # 创建一个图表对象\n",
    "chart1.set_source_data(sht3.range('A1').expand())  # 加载数据\n",
    "chart1.chart_type = 'line'  # 设置图标类型\n",
    "chart1.top = sht3.range('D2').top  \n",
    "chart1.left = sht3.range('D2').left  # 设置图标开始位置 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cccfa30e",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-charts](./imgs/Python_Excel_XLWings/xlwings-charts.png)\n",
    "\n",
    "除了绘制折线图，我们还可以绘制其他类型的图，修改`chart_type`值即可。\n",
    "```python\n",
    "# 查看其他chart_types值\n",
    "xw.constants.chart_types\n",
    "```\n",
    "\n",
    "返回结果很长，这里选几个常见的图形列出来：\n",
    "```\n",
    " '3d_line',  # 3D折线图\n",
    " '3d_pie', # 3D饼图\n",
    " 'area',  # 面积图\n",
    " 'bar_clustered',  # 柱状图相关\n",
    " 'bubble',  # 气泡图\n",
    " 'column_clustered',  # 条形图相关\n",
    " 'line',  # 折线图\n",
    " 'stock_hlc',  # 有意思 股票K线图\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12365239",
   "metadata": {},
   "source": [
    "- 将本地图片或者matplotlib图片保存到excel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "790dd190",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Picture 'matplotlib' in <Sheet [xlwings_wb.xlsx]third_sht>>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "matplotlib 生成的图片存入excel\n",
    "'''\n",
    "import matplotlib.pyplot as plt\n",
    "# 随便绘制一个饼图\n",
    "fig1 = plt.figure()  # 先创建一个图像对象\n",
    "plt.pie([0.5, 0.3, 0.2],  # 值\n",
    "        labels=['a', 'b', 'c'],  # 标签\n",
    "        explode=(0, 0.2, 0),  # （爆裂）距离\n",
    "        autopct='%1.1f%%',   # 显示百分数格式\n",
    "        shadow=True)  # 是否显示阴影\n",
    "plt.show() \n",
    "\n",
    "# 将饼图添加到excel指定位置 J17为图片开始位置\n",
    "sht3.pictures.add(fig1, name='matplotlib', \n",
    "                  left=sht3.range('J17').left, \n",
    "                  top=sht3.range('J17').top, update=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3878effd",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-matplotlib](./imgs/Python_Excel_XLWings/xlwings-matplotlib.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "16d435af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Picture 'local' in <Sheet [xlwings_wb.xlsx]third_sht>>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "本地图片存入excel\n",
    "'''\n",
    "# 将本地图片添加到excel指定位置 J1为图片开始位置\n",
    "pic_path = './imgs/logo.png'\n",
    "sht3.pictures.add(pic_path, name='local', \n",
    "                  left=sht3.range('J1').left, \n",
    "                  top=sht3.range('J1').top, update=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eef11a97",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-local](./imgs/Python_Excel_XLWings/xlwings-local.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97ff4a98",
   "metadata": {},
   "source": [
    "## 2.2 实战练习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1266953",
   "metadata": {
    "id": "2-1-基础语法一览-code-4"
   },
   "source": [
    "### 2.2.1 将消费数据可视化生成带平均线的趋势图，存入excel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "7e7646dc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Picture '消费情况' in <Sheet [xlwings_wb.xlsx]third_sht>>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "实战练习一：将消费数据可视化生成带平均线的趋势图，存入excel\n",
    "数据就是之前生成的模拟数据\n",
    "'''\n",
    "fig, ax = plt.subplots()  # 创建一个画板\n",
    "# 生成一条新线- 平均消费数据\n",
    "money_m = [df['money'].mean(axis=0) for i in range(len(df['money']))]\n",
    "# 建一条线：消费趋势折线图\n",
    "ax.plot(df.index, df['money'], color='#f16a0b', label='每日消费')\n",
    "# 再建一条线：平均消费直线图\n",
    "ax.plot(df.index, money_m, linestyle='--', color='#301502', label='平均消费')\n",
    "# 设置横纵坐标基础说明\n",
    "ax.set_xlabel(u'日期') \n",
    "ax.set_ylabel(u'消费金额/元') \n",
    "ax.set_title(u'消费折线图')  \n",
    "# 设置x轴值显示方向\n",
    "plt.setp(ax.get_xticklabels(), rotation=70, horizontalalignment='right')\n",
    "# 添加图例（label说明到图片上） loc设置显示位置\n",
    "ax.legend(loc=2) \n",
    "plt.show()\n",
    "sht3.pictures.add(fig, name='消费情况', \n",
    "                  left=sht3.range('D17').left, \n",
    "                  top=sht3.range('D17').top, update=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9e47fe3",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-practice1](./imgs/Python_Excel_XLWings/xlwings-practice1.png)\n",
    "\n",
    "[matplotlib 中文显示参考教程](https://juejin.cn/post/7011473852198977550)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "e95f28e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存新建的工作簿，并起一个名字（如果已存在有名字的excel文件，就直接save即可）\n",
    "wb.save()\n",
    "# 关闭工作簿（关闭Excel文件）\n",
    "wb.close()\n",
    "# 程序运行结束，退出Excel程序\n",
    "app.quit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce22f7a6",
   "metadata": {},
   "source": [
    "### 2.2.2 将股票数据以指定的格式存储到excel并生成股票走势图"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b7cc534",
   "metadata": {},
   "source": [
    "- 新建一个sheet，然后获取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "99c07d81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1990-12-19</td>\n",
       "      <td>96.050</td>\n",
       "      <td>99.980</td>\n",
       "      <td>95.790</td>\n",
       "      <td>99.980</td>\n",
       "      <td>126000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1990-12-20</td>\n",
       "      <td>104.300</td>\n",
       "      <td>104.390</td>\n",
       "      <td>99.980</td>\n",
       "      <td>104.390</td>\n",
       "      <td>19700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1990-12-21</td>\n",
       "      <td>109.070</td>\n",
       "      <td>109.130</td>\n",
       "      <td>103.730</td>\n",
       "      <td>109.130</td>\n",
       "      <td>2800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1990-12-24</td>\n",
       "      <td>113.570</td>\n",
       "      <td>114.550</td>\n",
       "      <td>109.130</td>\n",
       "      <td>114.550</td>\n",
       "      <td>3200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1990-12-25</td>\n",
       "      <td>120.090</td>\n",
       "      <td>120.250</td>\n",
       "      <td>114.550</td>\n",
       "      <td>120.250</td>\n",
       "      <td>1500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7686</th>\n",
       "      <td>2022-06-08</td>\n",
       "      <td>3245.017</td>\n",
       "      <td>3266.630</td>\n",
       "      <td>3216.015</td>\n",
       "      <td>3263.793</td>\n",
       "      <td>43418327000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7687</th>\n",
       "      <td>2022-06-09</td>\n",
       "      <td>3259.490</td>\n",
       "      <td>3270.557</td>\n",
       "      <td>3223.475</td>\n",
       "      <td>3238.954</td>\n",
       "      <td>42272837200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7688</th>\n",
       "      <td>2022-06-10</td>\n",
       "      <td>3214.185</td>\n",
       "      <td>3286.620</td>\n",
       "      <td>3210.808</td>\n",
       "      <td>3284.834</td>\n",
       "      <td>43986573000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7689</th>\n",
       "      <td>2022-06-13</td>\n",
       "      <td>3256.275</td>\n",
       "      <td>3272.991</td>\n",
       "      <td>3229.309</td>\n",
       "      <td>3255.551</td>\n",
       "      <td>43857831200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7690</th>\n",
       "      <td>2022-06-14</td>\n",
       "      <td>3224.214</td>\n",
       "      <td>3289.134</td>\n",
       "      <td>3195.819</td>\n",
       "      <td>3288.907</td>\n",
       "      <td>45038818700</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>7691 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            date      open      high       low     close       volume\n",
       "0     1990-12-19    96.050    99.980    95.790    99.980       126000\n",
       "1     1990-12-20   104.300   104.390    99.980   104.390        19700\n",
       "2     1990-12-21   109.070   109.130   103.730   109.130         2800\n",
       "3     1990-12-24   113.570   114.550   109.130   114.550         3200\n",
       "4     1990-12-25   120.090   120.250   114.550   120.250         1500\n",
       "...          ...       ...       ...       ...       ...          ...\n",
       "7686  2022-06-08  3245.017  3266.630  3216.015  3263.793  43418327000\n",
       "7687  2022-06-09  3259.490  3270.557  3223.475  3238.954  42272837200\n",
       "7688  2022-06-10  3214.185  3286.620  3210.808  3284.834  43986573000\n",
       "7689  2022-06-13  3256.275  3272.991  3229.309  3255.551  43857831200\n",
       "7690  2022-06-14  3224.214  3289.134  3195.819  3288.907  45038818700\n",
       "\n",
       "[7691 rows x 6 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "实战练习二：将股票数据以指定的格式存储到excel并生成股票走势图\n",
    "利用akshare爬取上证指数数据 代号：sh000001\n",
    "'''\n",
    "# 需要提前 pip install akshare 安装 akshare\n",
    "import akshare as ak\n",
    "import xlwings as xw\n",
    "import datetime \n",
    "\n",
    "# 新建一个sheet\n",
    "app = xw.App(visible=True, add_book=False)\n",
    "wb = app.books.open(root_path+'xlwings_wb.xlsx')\n",
    "sz_sht = wb.sheets.add('sz_sht')  # 第一次新建\n",
    "# sz_sht = wb.sheets['sz_sht']  # 已经存在，直接打开\n",
    "\n",
    "# 获取数据 open high low close volume index-date\n",
    "# volume 是成交量 多少股\n",
    "# 0、获取数据\n",
    "sz_index = ak.stock_zh_index_daily(symbol=\"sh000001\")\n",
    "sz_index"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff037e7a",
   "metadata": {},
   "source": [
    "- 处理并存储数据到excel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "700e0ae6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1、处理下数据\n",
    "sz_index.set_index('date', inplace=True)\n",
    "sz_data = sz_index[datetime.date(2022,1,1):datetime.date(2022,6,14)].iloc[:,0:4]  # 只取今年数据 ohlc\n",
    "sz_data.index = sz_data.index.to_series().apply(lambda x : x.strftime('%m-%d')) # 将索引日期格式改为 月-日\n",
    "\n",
    "# 2、存储数据\n",
    "sz_sht.range('A1').value = sz_data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4a6bf5f",
   "metadata": {},
   "source": [
    "- 处理表格中数据格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "c34c74c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3、处理数据格式\n",
    "# - 表头字体 格式加粗 背景颜色\n",
    "sz_sht.range('A1:E1').api.font_object.name.set('Calibri')\n",
    "sz_sht.range('A1:E1').api.font_object.font_style.set('加粗')\n",
    "sz_sht.range('A1:E1').api.font_object.color.set((255, 255, 255))\n",
    "# 背景颜色\n",
    "sz_sht.range('A1:E1').color = (16, 156, 245) \n",
    "# mac上居中未实现，有了解的小伙伴可以留言指出下，感谢\n",
    "# sz_sht.range('B1').api.font_object.horizontalalignment = xw.constants.Constants.xlCenter\n",
    "\n",
    "# - 添加边框\n",
    "# 1 左+内部竖线  \n",
    "sz_sht.range('A1:E177').api.get_border(which_border=1).weight.set(2)\n",
    "# 10 最右侧竖线\n",
    "sz_sht.range('A1:E177').api.get_border(which_border=10).weight.set(2)\n",
    "# 3 上+内部横线\n",
    "sz_sht.range('A1:E177').api.get_border(which_border=3).weight.set(2)\n",
    "# 9 最下面横线\n",
    "sz_sht.range('A1:E177').api.get_border(which_border=9).weight.set(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d63028f8",
   "metadata": {},
   "source": [
    "- 生成ohlc k线图并存储到excel指定位置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2d52f8e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4、生成图表\n",
    "chart_ohlc = sz_sht.charts.add()  # 创建一个图表对象\n",
    "chart_ohlc.set_source_data(sz_sht.range('A1').expand())  # 加载数据\n",
    "chart_ohlc.chart_type = 'stock_ohlc'  # 设置图标类型\n",
    "chart_ohlc.top = sz_sht.range('G2').top  \n",
    "chart_ohlc.left = sz_sht.range('G2').left  # 设置图标开始位置 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e10b75c8",
   "metadata": {},
   "source": [
    "运行结果：\n",
    "![xlwings-practice2](./imgs/Python_Excel_XLWings/xlwings-practice2.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "ba1986c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存新建的工作簿，并起一个名字（如果已存在有名字的excel文件，就直接save即可）\n",
    "wb.save()\n",
    "# 关闭工作簿（关闭Excel文件）\n",
    "wb.close()\n",
    "# 程序运行结束，退出Excel程序\n",
    "app.quit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eb576d2e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "name": "1 模块基本介绍与使用",
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "office",
   "language": "python",
   "name": "office"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
